﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using Messenger.Lib;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Services;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Tcp;
using System.Net;
using System.Text.RegularExpressions;
using System.IO;
using System.Collections;
using MessengerChatRoom;
namespace DA_CLIENT
{
    public partial class FrmMessenger : DevExpress.XtraEditors.XtraForm
    {
        public string IPWebcam_rq = ""; // Địa chi IP của máy Request webcam
        public string IPWebcam_rp = ""; // Địa chỉ Ip của máy Response webcam
        internal string contact;
        public string IPContact;
        private string[] setting = new string[6];
        public FrmMessenger()
        {
            InitializeComponent();
            
        }
        // Sự kiện khi người dùng bấm vào nút View Webcam.
        private void picWebcam_Click(object sender, EventArgs e)
        {
             //Nếu người dùng đang online thì mới có thể chia sẻ Webcam.
            if (Global.server.IsVisible(contact))
            {
                IPHostEntry IP = Dns.GetHostByName(Dns.GetHostName().ToString());
                string IP_rq = IP.AddressList[0].ToString();
                Global.server.Send(Global.username, contact, " cmd-Webcam: Đang yêu cầu chia sẻ chat Webcam - IP: " + IP_rq);
            }
            else
            {
                MessageBox.Show("Người này hiện không có Online để chat Webcam. Vui lòng thử lại vào lúc khác!", "Lỗi!");
            }
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            //Nếu người dùng đang online thì mới có thể chia sẻ ChatVoice.
            if (Global.server.IsVisible(contact))
            {
                IPHostEntry IP = Dns.GetHostByName(Dns.GetHostName().ToString());
                string IP_rq = IP.AddressList[0].ToString();
                Global.server.Send(Global.username, contact, " cmd-ChatVoice: Đang yêu cầu chia sẻ chat voice - IP: " + IP_rq);
            }
            else
            {
                MessageBox.Show("Người này hiện không có Online để chat voice. Vui lòng thử lại vào lúc khác!", "Lỗi!");
            }
        }

        private void btnGui_Click(object sender, EventArgs e)
        {
            rtbConversation.SelectionFont = new System.Drawing.Font("Microsoft Sans Serif", 9.75f, System.Drawing.FontStyle.Bold);
            rtbConversation.AppendText(Global.server.GetFullName(Global.username) + " : ");
            rtbConversation.SelectionFont = new System.Drawing.Font("Microsoft Sans Serif", 9.75f, System.Drawing.FontStyle.Regular);
            rtbConversation.AppendText(txtMessage.Text + " \n");
            //CharactertoIcon(rtbConversation);
            rtbConversation.Focus();
            //if (setting[5] == "1" || setting[5] == "2")
            //    WriteLogs(Global.username + " : " + txtMessage.Text); // Ghi log của mình gửi
            Global.server.Send(Global.username, contact, txtMessage.Text); // Có thể xử lý thêm trường hợp ko cho phép gửi tin nhắn tới "tài koản ko tồn tại" ở đây.
            txtMessage.Focus();
            txtMessage.ResetText();
        }

        private void rtbConversation_TextChanged(object sender, EventArgs e)
        {

        }
        // Lọc địa chỉ IP từ Message
        public string GetIPofContact(string message)
        {
            string pattern = @"(([0-1]?[0-9]{1,2}\.)|(2[0-4][0-9]\.)|(25[0-5]\.)){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))";
            Regex check = new Regex(pattern);
            Match m = check.Match(message);
            if (m.Success) return m.Value;
            return "Error";
        }
        // Kiểm tra có phải là yêu cầu xem webcam hay không?
        public string CheckWebcamRequest(string message)
        {
            if (message.Length > 11 && message.Substring(1, 10) == "cmd-Webcam")
            {
                string IP_rq = GetIPofContact(message);
                return IP_rq;
            }
            return "";
        }
        // Kiểm tra có phải là yêu cầu chat voice hay không ?
        public string CheckVoiceRequest(string message) {
            if (message.Length > 14 && message.Substring(1, 13) == "cmd-ChatVoice")
            {
                string IP_rq = GetIPofContact(message);
                return IP_rq;
            }
            return "";
        }
        internal void AddText(string person, string message)
        {
            //Chat đơn
            rtbConversation.SelectionFont = new System.Drawing.Font("Microsoft Sans Serif", 9.75f, System.Drawing.FontStyle.Bold);
            rtbConversation.AppendText(Global.server.GetFullName(person) + " : ");
            rtbConversation.SelectionFont = new System.Drawing.Font("Microsoft Sans Serif", 9.75f, System.Drawing.FontStyle.Regular);
            rtbConversation.AppendText(message + " \n");
            txtMessage.Focus();


            //Chat webcam
            // Kiểm tra có phải yêu cầu chat Webcam hay ko
            if (CheckWebcamRequest(message) != "")
            {
                this.Show();
                switch (MessageBox.Show(Global.server.GetFullName(contact) + " muốn mời bạn chat Webcam. Bạn có đồng ý không?", "Chat Webcam...", MessageBoxButtons.YesNo))
                {
                    case DialogResult.Yes:
                        IPHostEntry IP = Dns.GetHostByName(Dns.GetHostName().ToString());
                        string tempIP = IP.AddressList[0].ToString(); // IP máy phản hồi
                        Global.server.Send(Global.username, contact, "Được đồng ý chat webcam - IP: " + tempIP);
                        IPWebcam_rq = GetIPofContact(message); // IP của máy yêu cầu
                        FrmWebcam frmWebcam = new FrmWebcam(this);
                        frmWebcam.Show();
                        return;
                        break;
                    case DialogResult.No:
                        Global.server.Send(Global.username, contact, Global.username + " không muốn chat Webcam!");
                        this.DialogResult = DialogResult.None;
                        break;
                }
            }
            // Nhận IP chat webcam của máy phản hồi.
            if (message.IndexOf("Được đồng ý chat webcam") != -1)
            {
                IPWebcam_rp = GetIPofContact(message);
                FrmWebcam fw = new FrmWebcam(this);
                fw.Show();
            }

            // Nhận IP chat voice của máy phản hồi.
            if (message.IndexOf("Được đồng ý chat Voice") != -1)
            {
                IPWebcam_rp = GetIPofContact(message);
                FrmChatVoiceClient frmChatVoiceClient = new FrmChatVoiceClient();
                frmChatVoiceClient.Text = Global.server.GetFullName(contact);
                frmChatVoiceClient.Show();
            }
            // Kiểm tra có phải yêu cầu chat voice hay không
            if(CheckVoiceRequest(message)!=""){
                this.Show();
                switch (MessageBox.Show(Global.server.GetFullName(contact) + " muốn mời bạn chat Voice. Bạn có đồng ý không?", "Chat Voice...", MessageBoxButtons.YesNo))
                {
                    case DialogResult.Yes:
                        IPHostEntry IP = Dns.GetHostByName(Dns.GetHostName().ToString());
                        string tempIP = IP.AddressList[0].ToString(); // IP máy phản hồi
                        Global.server.Send(Global.username, contact, "Được đồng ý chat Voice - IP: " + tempIP);
                        IPWebcam_rq = GetIPofContact(message); // IP của máy yêu cầu
                        //FrmChatVoiceServer frmChatVoiceServer = new FrmChatVoiceServer();
                        //frmChatVoiceServer.Text = "Đây là Server";
                        //frmChatVoiceServer.Show();
                        //Chạy phương thức server ở đây
                        ServerStartChatVoie();
                        return;
                        break;
                    case DialogResult.No:
                        Global.server.Send(Global.username, contact, Global.username + " không muốn chat Voice!");
                        this.DialogResult = DialogResult.None;
                        break;
                }
            }
            // Kiểm tra bạn chat có yêu cầu gửi file cho mình hay ko.
            if (message == "Đang yêu cầu truyền tải file...") 
            {
                this.Show();
                Global.server.Send(Global.username, contact, "Đang chờ xác nhận yêu cầu gửi file...");
                switch (MessageBox.Show(Global.server.GetFullName(contact) + " muốn gửi cho bạn 1 file. Bạn có chấp nhận yêu cầu không?", "Yêu cầu truyền tải file", MessageBoxButtons.YesNo))
                {
                    case DialogResult.Yes:
                        ServerStart();
                        return;
                        break;
                    case DialogResult.No:
                        Global.server.Send(Global.username, contact, Global.server.GetFullName(Global.username) + " không chấp nhận yêu cầu gửi file của bạn!");
                        this.DialogResult = DialogResult.None;
                        break;
                }
            }
            if ((CheckSendFile(message)) != "")
            {
                IPContact = CheckSendFile(message);
                //Đã chấp nhận yêu cầu gửi file 
                ClientStart(); // Khởi động Client gửi file
            }
            if (message == "Bạn được mời tham gia vào Chat Room...")
            {
                this.Show();
                switch (MessageBox.Show(Global.server.GetFullName(contact) + " muốn mời bạn tham gia Chat Room. Bạn có chập nhận không?", "Yêu cầu tham gia Chat Room", MessageBoxButtons.YesNo))
                {
                    case DialogResult.Yes:
                        OpenRoom();
                        return;
                        break;
                    case DialogResult.No:
                        Global.server.Send(Global.username, contact, Global.username + " từ chối tham gia Chat Room!");
                        this.DialogResult = DialogResult.None;
                        break;
                }
            }
        }

        private void ServerStartChatVoie()
        {
            string STMSG = SocketCoderBinaryServer.Start_Video_Server(5000);
            FrmChatVoiceServer frmChatVoiceServer = new FrmChatVoiceServer();
            frmChatVoiceServer.Text = Global.server.GetFullName(contact);
            frmChatVoiceServer.Show();
        }

        bool ChatRoomClosed = false;
        public void GetValue(Boolean b)
        {
            ChatRoomClosed = b;
            if (ChatRoomClosed)
            {
                ChannelServices.UnregisterChannel(chan);
                chan = null;
            }
        }

        TcpChannel chan;
        private void OpenRoom()
        {
            ArrayList alOnlineUser = new ArrayList();
            FrmChatRoom objChatWin;

            if (chan == null)
            {
                chan = new TcpChannel();
                ChannelServices.RegisterChannel(chan, false);

                objChatWin = new FrmChatRoom();
                objChatWin.MyGetData = new FrmChatRoom.GetString(GetValue);
                IPHostEntry temp = Dns.GetHostByName(Dns.GetHostName().ToString());
                string IP = temp.AddressList[0].ToString();
                objChatWin.remoteObj = (SampleObject)Activator.GetObject(typeof(MessengerChatRoom.SampleObject), "tcp://" + IP + ":7070/" + contact);

                if (!objChatWin.remoteObj.JoinToChatRoom(Global.username))
                {
                    MessageBox.Show(Global.username + " đã đăng nhập rồi!. Có thể mạng bị lag, hãy thử lại sau!");
                    ChannelServices.UnregisterChannel(chan);
                    chan = null;
                    objChatWin.Dispose();
                    return;
                }
                objChatWin.key = objChatWin.remoteObj.CurrentKeyNo();
                objChatWin.yourName = Global.username;
                objChatWin.Show();
            }
            else
            {
                MessageBox.Show("Đã có lỗi xảy ra khi tạo Room Chat, vui lòng thử lại sau!");
                ChannelServices.UnregisterChannel(chan);
                chan = null;
            }
        }
        //Sự kiện khi người dùng bấm vào nút gửi file
        private void picSendFile_Click(object sender, EventArgs e)
        {
            // Nếu người dùng đang online thì mới được gửi file
            if (Global.server.IsVisible(contact))
            {
                Global.server.Send(Global.username, contact, "Đang yêu cầu truyền tải file...");
            }
            else
            {
                MessageBox.Show("Người này hiện không có Online để thực hiện việc truyền tải file. Vui lòng thử lại vào lúc khác!", "Lỗi!");
            }
        }
        // Server, lắng nghe kết nối để nhận file (sau khi đã ấn yes)
        public void ServerStart()
        {
            IPHostEntry IP = Dns.GetHostByName(Dns.GetHostName().ToString());
            string IP_temp = IP.AddressList[0].ToString();
            Global.server.Send(Global.username, contact, " cmd-SendFile: Đã chấp nhận yêu cầu gửi file (IP: " + IP_temp + ")"); // Thông báo tới người gửi
            FrmFileReceive ffr = new FrmFileReceive();
            ffr.Show();
        }
        // Client kết nối tới Server để gửi file
        public void ClientStart()
        {
            FrmFileSender ffs = new FrmFileSender();
            ffs.Show();
        }
        // Kiểm tra người dùng có chấp nhận yêu cầu send file hay không
        public string CheckSendFile(string message)
        {
            if (message.Length > 12 && message.Substring(1, 12) == "cmd-SendFile")
            {
                return GetIPofContact(message);
            }
            return "";
        }
        public void ReadUserSetting()
        {
            FileStream fs1 = new FileStream("UserInfo.txt", FileMode.Open);
            BinaryReader w1 = new BinaryReader(fs1);
            //Link thư mục lưu file
            setting[0] = w1.ReadString().ToString();
            w1.Close();
            fs1.Close();
        }

        private void FrmMessengerClosing(object sender, FormClosingEventArgs e)
        {
            Global.windowList.Remove(contact);
        }
    }
}